package cn.demoncat.util.mongo.util;

import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.mongodb.core.index.CompoundIndexDefinition;
import org.springframework.data.mongodb.core.index.Index;

/**
 * MongoDB索引工具
 *
 * @author 延晓磊
 *
 * @since 2017年7月22日
 * 
 * @see <a href="https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo-template.index-and-collections">mongo-template.index-and-collections</a>
 */
public class IndexUtil {

	/**
	 * 创建单域索引
	 * 
	 * @param field 域名
	 * @param isAsc 是否为升序
	 * @param isUnique 域值是否唯一
	 * @param background 是否后台异步创建索引
	 * @param indexName 索引名称：空则自动生成
	 * @param expire 过期时间：秒，Null则不过期
	 * @return Index 单域索引
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年7月22日
	*/
	public static Index build(String field, boolean isAsc, boolean isUnique, boolean background, String indexName,
							  Long expire) {
		// 创建单域索引：索引域，升序/降序
		Index index = new Index(field, isAsc ? Direction.ASC : Direction.DESC);
		// 索引名称
		if (StringUtils.isNotBlank(indexName)) index.named(indexName);
		// 索引唯一
		if (isUnique) index.unique();
		// 索引过期时间
		if (expire != null) index.expire(expire);
		// 后台异步创建索引
		if (background) index.background();
		return index;
	}

	/**
	 * 创建复合索引
	 * 
	 * @param map 域名和升序组合：{FieldA:1,FieldB:-1}，1升序/-1降序
	 * @param isUnique 域值是否唯一
	 * @param background 是否后台异步创建索引 
	 * @param indexName 索引名称：空则自动生成
	 * @param expire 过期时间：秒，Null则不过期
	 * @return
	 */
	public static CompoundIndexDefinition build(Map<String, Object> map, boolean isUnique, boolean background, String indexName, Long expire) {
		CompoundIndexDefinition index = new CompoundIndexDefinition(new Document(map));
		// 索引名称
		if (StringUtils.isNotBlank(indexName)) index.named(indexName);
		// 索引唯一
		if (isUnique) index.unique();
		// 索引过期时间
		if (expire != null) index.expire(expire);
		// 后台异步创建索引
		if (background) index.background();
		return index;
	}

}
